package network.server.handler.StoreHandler;

import module.StoreService.CartService;
import module.StoreService.Impl.CartServiceImpl;
import network.protocol.Request;
import network.protocol.Response;
import network.server.RequestHandler;

import java.util.Map;

/**
 * {@code CartHandler} 是购物车请求的处理器，实现了 {@link RequestHandler} 接口。
 * <p>
 * 主要功能：
 * <ul>
 *     <li>接收来自客户端的 {@link Request}</li>
 *     <li>根据请求的 action（方法名）调用对应的 {@link CartService} 方法</li>
 *     <li>返回统一的 {@link Response} 封装结果</li>
 * </ul>
 * <p>
 * 支持的操作：
 * <ul>
 *     <li>{@code getCartByUserId} - 根据用户 ID 获取购物车</li>
 *     <li>{@code createCart} - 为用户创建购物车</li>
 *     <li>{@code clearCart} - 清空用户购物车</li>
 *     <li>{@code getOrCreateCartId} - 获取或创建用户购物车 ID</li>
 * </ul>
 */
public class CartHandler implements RequestHandler {
    private final CartService cartService;

    /**
     * 构造函数，初始化时使用 {@link CartServiceImpl#getInstance()} 获取单例服务对象。
     */
    public CartHandler() {
        this.cartService = CartServiceImpl.getInstance();
    }

    /**
     * 处理来自客户端的请求，根据 {@code action} 调用对应的方法。
     *
     * @param req 客户端请求，包含 action 和参数
     * @return 统一的响应对象，包含执行结果或错误信息
     */
    @Override
    public Response<?> handle(Request req) {
        String action = req.getAction();
        String methodName = action.substring(action.indexOf('.') + 1);
        Map<String, Object> params = req.getParams();

        try {
            switch (methodName) {
                case "getCartByUserId":
                    return handleGetCartByUserId(params);
                case "createCart":
                    return handleCreateCart(params);
                case "clearCart":
                    return handleClearCart(params);
                case "getOrCreateCartId":
                    return handleGetOrCreateCartId(params);
                default:
                    return Response.error("未知操作: " + methodName);
            }
        } catch (NumberFormatException e) {
            return Response.error("参数格式错误: " + e.getMessage());
        } catch (Exception e) {
            return Response.error("处理请求时发生错误: " + e.getMessage());
        }
    }

    /**
     * 处理获取用户购物车的请求。
     *
     * @param params 请求参数，必须包含 {@code userId}
     * @return 用户购物车信息，或错误响应
     */
    private Response<?> handleGetCartByUserId(Map<String, Object> params) {
        if (!params.containsKey("userId")) {
            return Response.error("缺少必要参数: userId");
        }
        try {
            Object userIdObj = params.get("userId");
            if (userIdObj == null) {
                return Response.error("userId参数不能为null");
            }
            long userId = Long.parseLong(userIdObj.toString());
            return cartService.getCartByUserId(userId);
        } catch (NumberFormatException e) {
            return Response.error("userId参数格式错误");
        }
    }

    /**
     * 处理创建购物车的请求。
     *
     * @param params 请求参数，必须包含 {@code userId}
     * @return 创建结果，成功返回 {@code true}，否则返回错误信息
     */
    private Response<?> handleCreateCart(Map<String, Object> params) {
        if (!params.containsKey("userId")) {
            return Response.error("缺少必要参数: userId");
        }
        try {
            Object userIdObj = params.get("userId");
            if (userIdObj == null) {
                return Response.error("userId参数不能为null");
            }
            long userId = Long.parseLong(userIdObj.toString());
            return cartService.createCart(userId);
        } catch (NumberFormatException e) {
            return Response.error("userId参数格式错误");
        }
    }

    /**
     * 处理清空购物车的请求。
     *
     * @param params 请求参数，必须包含 {@code userId}
     * @return 清空结果，成功返回 {@code true}，否则返回错误信息
     */
    private Response<?> handleClearCart(Map<String, Object> params) {
        if (!params.containsKey("userId")) {
            return Response.error("缺少必要参数: userId");
        }
        try {
            Object userIdObj = params.get("userId");
            if (userIdObj == null) {
                return Response.error("userId参数不能为null");
            }
            long userId = Long.parseLong(userIdObj.toString());
            return cartService.clearCart(userId);
        } catch (NumberFormatException e) {
            return Response.error("userId参数格式错误");
        }
    }

    /**
     * 处理获取或创建购物车 ID 的请求。
     *
     * @param params 请求参数，必须包含 {@code userId}
     * @return 用户购物车 ID，或错误响应
     */
    private Response<?> handleGetOrCreateCartId(Map<String, Object> params) {
        if (!params.containsKey("userId")) {
            return Response.error("缺少必要参数: userId");
        }
        try {
            Object userIdObj = params.get("userId");
            if (userIdObj == null) {
                return Response.error("userId参数不能为null");
            }
            long userId = Long.parseLong(userIdObj.toString());
            return cartService.getOrCreateCartId(userId);
        } catch (NumberFormatException e) {
            return Response.error("userId参数格式错误");
        }
    }
}
